package escalonador;

import java.io.PrintStream;

/**
 * Classe responsavel por gerar o Log e imprimir informacoes na tela.
 * 
 * @author Barbara Barbosa Silva
 * @author Daniel Tsuha
 * @author Felipe Sa de Mello
 * @author Lucas Machado
 */
public class Logger {

	/**
	 * {@link PrintStream} responsavel por escrever no arquivo de saida.
	 */
	public static PrintStream writer;

	/**
	 * Informa que um processo foi carregado.
	 * 
	 * @param processo
	 *            {@link BCP} do processo carregado.
	 */
	public static void carregando(BCP processo) {
		print("Carregando " + processo.nome);
	}

	/**
	 * Informa que um processo esta sendo executado.
	 * 
	 * @param processo
	 *            {@link BCP} do processo que esta sendo executado.
	 */
	public static void executando(BCP processo) {
		print("Executando " + processo.nome);
	}

	/**
	 * Informar que o processo fez um requisicao de entrada/saida.
	 * 
	 * @param processo
	 *            {@link BCP} do processo que fez a requisicao de entrada/saida.
	 */
	public static void entradaSaida(BCP processo) {
		print("E/S em " + processo.nome);
	}

	/**
	 * Informa que o processo foi interrompido.
	 * 
	 * @param processo
	 *            {@link BCP} do processo que foi interrompido.
	 * @param instrucoes
	 *            Numero de instrucoes executadas antes do processo ser
	 *            interrompido.
	 */
	public static void interrompendo(BCP processo, int instrucoes) {
		if (instrucoes == 1) {
			print("Interrompendo " + processo.nome + " apos " + instrucoes + " instrucao");
		} else {
			print("Interrompendo " + processo.nome + " apos " + instrucoes
					+ " instrucoes");
		}
	}

	/**
	 * Informa o fim do processo.
	 * 
	 * @param processo
	 *            {@link BCP} do processo que foi terminado.
	 */
	public static void terminado(BCP processo) {
		print(processo.nome + " terminado. " + "X=" + processo.X + ". Y=" + processo.Y);
	}

	/**
	 * Informa a media das trocas de processo no processado.
	 * 
	 * @param trocas
	 *            Media de trocas.
	 */
	public static void mediaTrocas(double trocas) {
		print("MEDIA DE TROCAS: " + trocas);
	}

	/**
	 * Informa a media de instrucoes por quantum.
	 * 
	 * @param instrucoes
	 *            Media de instrucoes por quantum.
	 */
	public static void mediaInstrucoes(double instrucoes) {
		print("MEDIA DE INSTRUCOES: " + instrucoes);
	}

	/**
	 * Informa o tamanho do Quantum do processador.
	 * 
	 * @param processador
	 *            Processador que executou os processos.
	 */
	public static void quantum(Processador processador) {
		print("QUANTUM: " + processador.quantum);
	}

	/**
	 * Escreve um texto text na tela e no logfile.
	 * 
	 * @param text
	 *            {@link String} Texto a ser escrito na tela e no logfile.
	 */
	public static void print(String text) {
		System.out.println(text);
		writer.println(text);
	}
}